<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../../vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- vue对对象的所有的属性也进行了深度监听，只要属性值发生改变，也可以重新渲染
        如果在修改对象的属性时，如果出现了无法更新的现象，可以使用vm.$set() -->
        <button @click="person.age++">修改</button>
        <p>年龄是：{{person.age}}</p>

        <!-- 删除对象中的属性 -->
        <button @click="deleteAttr">删除name属性</button>
        <p>姓名是：{{person.name}}</p>

        <!-- 给对象添加属性 -->
        <button @click="addAttr">添加sex属性</button>
        <p>性别是：{{person.sex}}</p>

    </div>
    <script>
        /* 设置为 false 以阻止 vue 在启动时生成生产提示 */
        Vue.config.productionTip = false;
        //实例化Vue
        const vm = new Vue({
            //el代表的是容器,值是一个选择器或者是一个元素,一般使用id(因为id是唯一的)
            el: "#app",
            //data必须声明为返回一个初始数据对象的函数,因为数组可能被用来创建多个实例.如果data仍然是一个存粹的对象,则所有的实例将共享引用同一个数据对象!通过提供data函数,每次创建一个新实例后,我们能够调用data函数,从而返回初始数据的一个全新副本数据对象
            data() {
                return {
                    person:{
                        name:"liuMin",
                        age:18,
                    }
                }
            },
            methods:{
                deleteAttr(){
                    //删除属性的错误写法（因为vue没有对属性的删除行为进行监听，所以不会更新视图）：
                    // delete this.person.name

                    // 需使用Vue.delete()或者vm.$delete()方法删除（这两个只是存放的位置不同的同一个方法）
                    // Vue.delete(this.person,"name")
                    vm.$delete(this.person,"name")                
                },

                addAttr(){
                    /* 新增属性的错误写法（因为vue中没有对sex属性进行监听，所以不会更新视图）： */
                    // this.person.sex = "男"

                    /* 需要使用Vue.set()或者 vm.$set()方法新增（两种方法相同，只是存放位置不同），可以新增和修改 */
                    // Vue.set(this.person,"sex","男")
                    vm.$set(this.person,"sex","男")

                }
            }
        })
    </script>
</body>

</html>